# Module 'dump'
#
# Affiche le code Python permettant de reconstruire une variable.
# Ceci ne marche que dans certains cas.
#
# Cela fonctionne bien pour :
# - les entiers et nombres à virgule flottante (la valeur NaN exceptée, ainsi
#   que les autres trucs bizarres)
# - les chaînes
# - les objets composés et les listes, à condition que cela fonctionne pour
#   chacun de leurs éléments
# - les modules importés, à condition que le nom passé soit le véritable nom du
#   module
#
# Cela fonctionne pour les dictionnaires de haut niveau mais pas pour les
# dictionnaires contenus dans d'autres objets (on pourrait corriger ça en se
# creusant la tête, néanmoins).
#
# Cela ne fonctionne pas pour les fonctions (de toute sorte), les classes, les
# objets classe, les fenêtres, les fichiers etc.
#
# Enfin, si plus d'un nom fait référence à un même objet, ou si un objet est
# contenu dans deux autres objets ou plus, alors cet objet n'est plus partagé
# une fois recréé (ce n'est pas adapté aux chaînes servant d'identifiants pour
# les exceptions, par exemple).

# Recrée une table de symboles entière
#
def dumpsymtab(dict):
	for key in dict.keys():
		dumpvar(key, dict[key])

# Recrée une variable
#
def dumpvar(name, x):
	import sys
	t = type(x)
	if t = type({}):
		print name, '= {}'
		for key in x.keys():
			item = x[key]
			if not printable(item):
				print '#',
			print name, '[', `key`, '] =', `item`
	elif t in (type(''), type(0), type(0.0), type([]), type(())):
		if not printable(x):
			print '#',
		print name, '=', `x`
	elif t = type(sys):
		print 'import', name, '#', x
	else:
		print '#', name, '=', x

# vérifie si une valeur est affichable, au sens qu'elle peut être lue avec
# input()
#
def printable(x):
	t = type(x)
	if t in (type(''), type(0), type(0.0)):
		return 1
	if t in (type([]), type(())):
		for item in x:
			if not printable(item):
				return 0
		return 1
	if x = {}:
		return 1
	return 0
